#include "../Comm/httplib.h"
#include "Control.hpp"

#include <signal.h>

using namespace httplib;
using namespace Control_NS;

static Control* ctrl_ptr = nullptr;

void Recover(int signo)
{
    ctrl_ptr->RecoverMachine();
}

int main()
{
    // 用户请求的路由功能
    Server ser;
    Control ctrl;
    ctrl_ptr = &ctrl;

    // 我们将3号信号自定义为执行Recover函数，用来恢复离线的主机
    signal(3,Recover);

    // 获取所有题目的列表 all_question
    ser.Get("/all_questions",[&ctrl](const Request& req,Response& resp){
        std::string html;
        ctrl.AllQuestions(&html);
        resp.set_content(html,"text/html;charset=utf-8");
    });

    // 获取特定一个题目的内容 question/(/d+)
    ser.Get(R"(/question/(\d+))",[&ctrl](const Request& req,Response& resp){
        std::string html;
        std::string number = req.matches[1];
        ctrl.OneQuestion(number,&html);
        resp.set_content(html,"text/html;charset=utf-8");
    });

    // 用户提交代码，程序对用户的代码进行测试 judge/(/d+)
    ser.Post(R"(/judge/(\d+))",[&ctrl](const Request& req,Response& resp){
        std::string number = req.matches[1];
        std::string result_json;
        ctrl.Judge(number,req.body,&result_json);
        resp.set_content(result_json,"application/json;charset=utf-8");
    });

    // 设置主页
    ser.set_base_dir("./wwwRoot");

    ser.listen("0.0.0.0",8888);

    return 0;
}


// 测试
// int main()
// {
//     // 用户请求的路由功能
//     Server ser;
//     // 获取所有题目的列表 all_question
//     ser.Get("/all_questions",[](const Request& req,Response& resp){
//         resp.set_content("这是所有题目的列表","text/plain;charset=utf-8");
//     });
//     // 获取特定一个题目的内容 question/(/d+)
//     // R"()" , 定义原始字符串字面量 , 使内部字符串中的特殊字符不被转义
//     // \d+在正则表达式中代表一个或多个数字字符
//     ser.Get(R"(/question/(\d+))",[](const Request& req,Response& resp){
//         // 获得结果：这是题目/question/100 , 使用req.matches[0]
//         // 获得结果：这是题目100 , 使用req.matches[1];
//         // 当上面的正则表达式匹配到一个URL路径时
//         // req.matches[0] 将包含整个匹配的字符串，matches[0]通常代表整个正则表达式匹配到的内容。
//         // req.matches[1] 将只包含第一个捕获组匹配到的内容
//         std::string number = req.matches[1];
//         resp.set_content("这是题目" + number,"text/plain;charset=utf-8");
//     });

//     // 用户提交代码，程序对用户的代码进行测试 judge/(/d+)
//     ser.Get(R"(/judge/(\d+))",[](const Request& req,Response& resp){
//         std::string number = req.matches[1];
//         resp.set_content("测试题目" + number,"text/plain;charset=utf-8");
//     });

//     // 设置主页
//     ser.set_base_dir("/wwwRoot");

//     ser.listen("0.0.0.0",8888);

//     return 0;
// }